﻿package lu.kyle {
	public final class ZigZagIntBlock {
		public var data:int;
		public var next:ZigZagIntBlock;
		public var down:ZigZagIntBlock;
		public var zzprev:ZigZagIntBlock;
		public var zznext:ZigZagIntBlock;
		public function ZigZagIntBlock(dt:int, nx:ZigZagIntBlock, dn:ZigZagIntBlock, zp:ZigZagIntBlock, zn:ZigZagIntBlock) {
			data = dt;
			next = nx;
			down = dn;
			zzprev = zp;
			zznext = zn;
		}
		/*
		private static var ZigZag:Array = [
			 0, 1, 5, 6,14,15,27,28,
			 2, 4, 7,13,16,26,29,42,
			 3, 8,12,17,25,30,41,43,
			 9,11,18,24,31,40,44,53,
			10,19,23,32,39,45,52,54,
			20,22,33,38,46,51,55,60,
			21,34,37,47,50,56,59,61,
			35,36,48,49,57,58,62,63
		];
		private static var ZigZagAlt:Array = [
			 0, 1, 8,16, 9, 2, 3,10,
			17,24,32,25,18,11, 4, 5,
			12,19,26,33,40,48,41,34,
			27,20,13, 6, 7,14,21,28,
			35,42,49,56,57,50,43,36,
			29,22,15,23,30,37,44,51,
			58,59,52,45,38,31,39,46,
			53,60,61,54,47,55,62,63
		];
		*/
		public static function create(src:Array):ZigZagIntBlock {
			if (!(src && src.length == 64)) return null;

			var dst63:ZigZagIntBlock = new ZigZagIntBlock(src[63],  null,  null,  null,  null);
			var dst62:ZigZagIntBlock = new ZigZagIntBlock(src[62], dst63,  null,  null, dst63);
			var dst61:ZigZagIntBlock = new ZigZagIntBlock(src[61], dst62,  null,  null,  null);
			var dst60:ZigZagIntBlock = new ZigZagIntBlock(src[60], dst61,  null,  null, dst61);

			var dst59:ZigZagIntBlock = new ZigZagIntBlock(src[59], dst60,  null,  null,  null);
			var dst58:ZigZagIntBlock = new ZigZagIntBlock(src[58], dst59,  null,  null, dst59);
			var dst57:ZigZagIntBlock = new ZigZagIntBlock(src[57], dst58,  null,  null,  null);
			var dst56:ZigZagIntBlock = new ZigZagIntBlock(src[56], dst57,  null,  null, dst57);
			var dst55:ZigZagIntBlock = new ZigZagIntBlock(src[55], dst56, dst63,  null, dst62);
			var dst54:ZigZagIntBlock = new ZigZagIntBlock(src[54], dst55, dst62, dst61,  null);
			var dst53:ZigZagIntBlock = new ZigZagIntBlock(src[53], dst54, dst61,  null, dst60);
			var dst52:ZigZagIntBlock = new ZigZagIntBlock(src[52], dst53, dst60, dst59,  null);
			var dst51:ZigZagIntBlock = new ZigZagIntBlock(src[51], dst52, dst59,  null, dst58);
			var dst50:ZigZagIntBlock = new ZigZagIntBlock(src[50], dst51, dst58, dst57,  null);

			var dst49:ZigZagIntBlock = new ZigZagIntBlock(src[49], dst50, dst57,  null, dst56);
			var dst48:ZigZagIntBlock = new ZigZagIntBlock(src[48], dst49, dst56,  null,  null);
			var dst47:ZigZagIntBlock = new ZigZagIntBlock(src[47], dst48, dst55, dst54, dst55);
			var dst46:ZigZagIntBlock = new ZigZagIntBlock(src[46], dst47, dst54,  null, dst53);
			var dst45:ZigZagIntBlock = new ZigZagIntBlock(src[45], dst46, dst53, dst52,  null);
			var dst44:ZigZagIntBlock = new ZigZagIntBlock(src[44], dst45, dst52,  null, dst51);
			var dst43:ZigZagIntBlock = new ZigZagIntBlock(src[43], dst44, dst51, dst50,  null);
			var dst42:ZigZagIntBlock = new ZigZagIntBlock(src[42], dst43, dst50,  null, dst49);
			var dst41:ZigZagIntBlock = new ZigZagIntBlock(src[41], dst42, dst49, dst48,  null);
			var dst40:ZigZagIntBlock = new ZigZagIntBlock(src[40], dst41, dst48,  null, dst48);

			var dst39:ZigZagIntBlock = new ZigZagIntBlock(src[39], dst40, dst47,  null, dst46);
			var dst38:ZigZagIntBlock = new ZigZagIntBlock(src[38], dst39, dst46, dst45,  null);
			var dst37:ZigZagIntBlock = new ZigZagIntBlock(src[37], dst38, dst45,  null, dst44);
			var dst36:ZigZagIntBlock = new ZigZagIntBlock(src[36], dst37, dst44, dst43,  null);
			var dst35:ZigZagIntBlock = new ZigZagIntBlock(src[35], dst36, dst43,  null, dst42);
			var dst34:ZigZagIntBlock = new ZigZagIntBlock(src[34], dst35, dst42, dst41,  null);
			var dst33:ZigZagIntBlock = new ZigZagIntBlock(src[33], dst34, dst41,  null, dst40);
			var dst32:ZigZagIntBlock = new ZigZagIntBlock(src[32], dst33, dst40,  null,  null);
			var dst31:ZigZagIntBlock = new ZigZagIntBlock(src[31], dst32, dst39, dst38, dst39);
			var dst30:ZigZagIntBlock = new ZigZagIntBlock(src[30], dst31, dst38,  null, dst37);

			var dst29:ZigZagIntBlock = new ZigZagIntBlock(src[29], dst30, dst37, dst36,  null);
			var dst28:ZigZagIntBlock = new ZigZagIntBlock(src[28], dst29, dst36,  null, dst35);
			var dst27:ZigZagIntBlock = new ZigZagIntBlock(src[27], dst28, dst35, dst34,  null);
			var dst26:ZigZagIntBlock = new ZigZagIntBlock(src[26], dst27, dst34,  null, dst33);
			var dst25:ZigZagIntBlock = new ZigZagIntBlock(src[25], dst26, dst33, dst32,  null);
			var dst24:ZigZagIntBlock = new ZigZagIntBlock(src[24], dst25, dst32,  null, dst32);
			var dst23:ZigZagIntBlock = new ZigZagIntBlock(src[23], dst24, dst31,  null, dst30);
			var dst22:ZigZagIntBlock = new ZigZagIntBlock(src[22], dst23, dst30, dst29,  null);
			var dst21:ZigZagIntBlock = new ZigZagIntBlock(src[21], dst22, dst29,  null, dst28);
			var dst20:ZigZagIntBlock = new ZigZagIntBlock(src[20], dst21, dst28, dst27,  null);

			var dst19:ZigZagIntBlock = new ZigZagIntBlock(src[19], dst20, dst27,  null, dst26);
			var dst18:ZigZagIntBlock = new ZigZagIntBlock(src[18], dst19, dst26, dst25,  null);
			var dst17:ZigZagIntBlock = new ZigZagIntBlock(src[17], dst18, dst25,  null, dst24);
			var dst16:ZigZagIntBlock = new ZigZagIntBlock(src[16], dst17, dst24,  null,  null);
			var dst15:ZigZagIntBlock = new ZigZagIntBlock(src[15], dst16, dst23, dst22, dst23);
			var dst14:ZigZagIntBlock = new ZigZagIntBlock(src[14], dst15, dst22,  null, dst21);
			var dst13:ZigZagIntBlock = new ZigZagIntBlock(src[13], dst14, dst21, dst20,  null);
			var dst12:ZigZagIntBlock = new ZigZagIntBlock(src[12], dst13, dst20,  null, dst19);
			var dst11:ZigZagIntBlock = new ZigZagIntBlock(src[11], dst12, dst19, dst18,  null);
			var dst10:ZigZagIntBlock = new ZigZagIntBlock(src[10], dst11, dst18,  null, dst17);

			var dst09:ZigZagIntBlock = new ZigZagIntBlock(src[ 9], dst10, dst17, dst16,  null);
			var dst08:ZigZagIntBlock = new ZigZagIntBlock(src[ 8], dst09, dst16,  null, dst16);
			var dst07:ZigZagIntBlock = new ZigZagIntBlock(src[ 7], dst08, dst15,  null, dst14);
			var dst06:ZigZagIntBlock = new ZigZagIntBlock(src[ 6], dst07, dst14, dst13, dst07);
			var dst05:ZigZagIntBlock = new ZigZagIntBlock(src[ 5], dst06, dst13,  null, dst12);
			var dst04:ZigZagIntBlock = new ZigZagIntBlock(src[ 4], dst05, dst12, dst11, dst05);
			var dst03:ZigZagIntBlock = new ZigZagIntBlock(src[ 3], dst04, dst11,  null, dst10);
			var dst02:ZigZagIntBlock = new ZigZagIntBlock(src[ 2], dst03, dst10, dst09, dst03);
			var dst01:ZigZagIntBlock = new ZigZagIntBlock(src[ 1], dst02, dst09,  null, dst08);
			var dst00:ZigZagIntBlock = new ZigZagIntBlock(src[ 0], dst01, dst08, dst63, dst01);

			dst63.zzprev = dst62;
			dst62.zzprev = dst55;
			dst61.zzprev = dst60;
			dst60.zzprev = dst53;

			dst59.zzprev = dst58;
			dst58.zzprev = dst51;
			dst57.zzprev = dst56;
			dst56.zzprev = dst49;
			dst55.zzprev = dst47;
			dst53.zzprev = dst46;
			dst51.zzprev = dst44;

			dst49.zzprev = dst42;
			dst48.zzprev = dst40;
			dst46.zzprev = dst39;
			dst44.zzprev = dst37;
			dst42.zzprev = dst35;
			dst40.zzprev = dst33;

			dst39.zzprev = dst31;
			dst37.zzprev = dst30;
			dst35.zzprev = dst28;
			dst33.zzprev = dst26;
			dst32.zzprev = dst24;
			dst30.zzprev = dst23;

			dst28.zzprev = dst21;
			dst26.zzprev = dst19;
			dst24.zzprev = dst17;
			dst23.zzprev = dst15;
			dst21.zzprev = dst14;

			dst19.zzprev = dst12;
			dst17.zzprev = dst10;
			dst16.zzprev = dst08;
			dst14.zzprev = dst07;
			dst12.zzprev = dst05;
			dst10.zzprev = dst03;

			dst08.zzprev = dst01;
			dst07.zzprev = dst06;
			dst05.zzprev = dst04;
			dst03.zzprev = dst02;
			dst01.zzprev = dst00;

			dst63.zznext = dst00;
			dst61.zznext = dst54;

			dst59.zznext = dst52;
			dst57.zznext = dst50;
			dst54.zznext = dst47;
			dst52.zznext = dst45;
			dst50.zznext = dst43;

			dst48.zznext = dst41;
			dst45.zznext = dst38;
			dst43.zznext = dst36;
			dst41.zznext = dst34;

			dst38.zznext = dst31;
			dst36.zznext = dst29;
			dst34.zznext = dst27;
			dst32.zznext = dst25;

			dst29.zznext = dst22;
			dst27.zznext = dst20;
			dst25.zznext = dst18;
			dst22.zznext = dst15;
			dst20.zznext = dst13;

			dst18.zznext = dst11;
			dst16.zznext = dst09;
			dst13.zznext = dst06;
			dst11.zznext = dst04;

			dst09.zznext = dst02;

			return dst00;
		}
	}
}
